package request

import (
	"bytes"
	"fmt"
	"strings"
	"time"

	// "strconv"
	"encoding/json"
	"io"
	"io/ioutil"
	"net/http"
	"net/url"
)

// 发送GET请求
// url：         请求地址
// response：    请求返回的内容
func GetByBasicAuth(url string, username string, password string) string {
	client := &http.Client{}
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		// handle error
	}

	req.SetBasicAuth(username, password)

	resp, err := client.Do(req)

	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		// handle error
	}

	return string(body)
}

// 发送POST请求
// url：         请求地址
// response：    请求返回的内容
func PostByBasicAuth(addr string, username string, password string) string {
	data := url.Values{}
	data.Set("topic", "dqt201/sss0000002/tx")
	data.Set("payload", "example")
	data.Set("clientid", "sss0000002")
	data.Set("qos", "1")
	data.Set("retain", "false")
	fmt.Println(data)

	client := &http.Client{}
	req, err := http.NewRequest("POST", addr, strings.NewReader(data.Encode()))
	if err != nil {
		// handle error
	}

	req.SetBasicAuth(username, password)

	req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
	// req.Header.Add("Content-Length", strconv.Itoa(len(data.Encode())))
	fmt.Println(req.PostForm)
	fmt.Println(req.Header)

	resp, err := client.Do(req)

	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		// handle error
	}

	return string(body)
}

// 发送GET请求
// url：         请求地址
// response：    请求返回的内容
func Get(url string) string {

	// 超时时间：5秒
	client := &http.Client{Timeout: 5 * time.Second}

	resp, err := client.Get(url)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	var buffer [512]byte
	result := bytes.NewBuffer(nil)
	for {
		n, err := resp.Body.Read(buffer[0:])
		result.Write(buffer[0:n])
		if err != nil && err == io.EOF {
			break
		} else if err != nil {
			panic(err)
		}
	}

	return result.String()
}

// 发送POST请求
// url：         请求地址
// data：        POST请求提交的数据
// contentType： 请求体格式，如：application/json
// content：     请求放回的内容
func Post(url string, data interface{}, contentType string) string {

	// 超时时间：5秒
	client := &http.Client{Timeout: 5 * time.Second}
	jsonStr, _ := json.Marshal(data)
	resp, err := client.Post(url, contentType, bytes.NewBuffer(jsonStr))
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	result, _ := ioutil.ReadAll(resp.Body)
	return string(result)
}
